#Boa:Frame:Frame1

import wx
import utiles
import consultasBD
import Vista
from decimal import Decimal

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1COMBOBOX1, 
 wxID_FRAME1COMBOBOX2, wxID_FRAME1COMBOBOX3, wxID_FRAME1PANEL1, 
 wxID_FRAME1STATICTEXT1, wxID_FRAME1STATICTEXT2, wxID_FRAME1STATICTEXT3, 
] = [wx.NewId() for _init_ctrls in range(10)]

class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(539, 246), size=wx.Size(312, 245),
              style=wx.DEFAULT_FRAME_STYLE, title='Igualar Tablas')
        self.SetClientSize(wx.Size(304, 218))

        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
              pos=wx.Point(0, 0), size=wx.Size(304, 218),
              style=wx.TAB_TRAVERSAL)

        self.staticText1 = wx.StaticText(id=wxID_FRAME1STATICTEXT1,
              label='Sucursal que sera procesada', name='staticText1',
              parent=self.panel1, pos=wx.Point(24, 16), size=wx.Size(138, 13),
              style=0)

        self.comboBox1 = wx.ComboBox(choices=[], id=wxID_FRAME1COMBOBOX1,
              name='comboBox1', parent=self.panel1, pos=wx.Point(24, 32),
              size=wx.Size(168, 21), style=0, value='')
        self.comboBox1.SetLabel('')

        self.staticText2 = wx.StaticText(id=wxID_FRAME1STATICTEXT2,
              label='Sucursal desde la que se traen datos', name='staticText2',
              parent=self.panel1, pos=wx.Point(24, 64), size=wx.Size(177, 13),
              style=0)

        self.comboBox2 = wx.ComboBox(choices=[], id=wxID_FRAME1COMBOBOX2,
              name='comboBox2', parent=self.panel1, pos=wx.Point(24, 80),
              size=wx.Size(168, 21), style=0, value='')
        self.comboBox2.SetLabel('')

        self.staticText3 = wx.StaticText(id=wxID_FRAME1STATICTEXT3,
              label='Tabla a procesar (debe existir en ambas sucursales)',
              name='staticText3', parent=self.panel1, pos=wx.Point(24, 112),
              size=wx.Size(249, 13), style=0)

        self.comboBox3 = wx.ComboBox(choices=[], id=wxID_FRAME1COMBOBOX3,
              name='comboBox3', parent=self.panel1, pos=wx.Point(24, 128),
              size=wx.Size(168, 21), style=0, value='productos')
        self.comboBox3.SetLabel('productos')

        self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label='Aceptar',
              name='button1', parent=self.panel1, pos=wx.Point(24, 176),
              size=wx.Size(112, 23), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnAceptar, id=wxID_FRAME1BUTTON1)

        self.button2 = wx.Button(id=wxID_FRAME1BUTTON2, label='Salir',
              name='button2', parent=self.panel1, pos=wx.Point(160, 176),
              size=wx.Size(112, 23), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnSalir, id=wxID_FRAME1BUTTON2)

    def __init__(self, parent):
        self._init_ctrls(parent)
        self.cargarCombos()
        
    def cargarCombos(self):
        sucursal = utiles.getSucursalActiva()
        SQL = "SELECT nombre FROM sucursales WHERE codsucursal='%s'" % (sucursal)
        resultado = consultasBD.ordenCrudaDict(SQL)
        self.comboBox1.SetLabel(resultado[0]['nombre'])
        SQL = "SELECT nombre FROM sucursales"
        resultado = consultasBD.ordenCrudaDict(SQL)
        for item in resultado:
            self.comboBox1.Append(item["nombre"])
            self.comboBox2.Append(item["nombre"])
        consultaSQL = "SHOW TABLES"
        self.resultado = consultasBD.ordenCruda(consultaSQL)
        for tabla in self.resultado:
            self.comboBox3.Append(tabla[0])

    def OnSalir(self, event):
        self.Close()
        
    def OnAceptar(self, event):
        self.button1.Enable(False)
        self.button2.Enable(False)
        self.indice1 = -1
        self.indice2 = -1
        tablaOK = False
        sucursales = self.comboBox1.GetItems()
        tablas = self.comboBox3.GetItems()
        for i,sucursal in enumerate(sucursales):
            if self.comboBox1.GetValue() == sucursal:
                self.indice1 = i
                break
        for i,sucursal in enumerate(sucursales):
            if self.comboBox2.GetValue() == sucursal:
                self.indice2 = i
                break
        for tabla in tablas:
            if self.comboBox3.GetValue() == tabla:
                tablaOK = True
                break
        if self.indice1 < 0:
            texto = "Debe seleccionar sucursal a procesar"
            utiles.mensaje(None,texto)
            self.comboBox1.SetFocus()
            self.button1.Enable(True)
            self.button2.Enable(True)
            return
        if self.indice2 < 0:
            texto = "Debe seleccionar sucursal desde la\nque se traen datos"
            utiles.mensaje(None,texto)
            self.comboBox2.SetFocus()
            self.button1.Enable(True)
            self.button2.Enable(True)
            return
        if self.indice1 == self.indice2:
            texto = "Las sucursales deben ser diferentes"
            utiles.mensaje(None,texto)
            self.comboBox2.SetFocus()
            self.button1.Enable(True)
            self.button2.Enable(True)
            return
        if not tablaOK:
            texto = "Debe seleccionar una tabla valida"
            utiles.mensaje(None,texto)
            self.comboBox3.SetFocus()
            self.button1.Enable(True)
            self.button2.Enable(True)
            return
        print "Sucursal a procesar:",sucursales[self.indice1]
        print "Sucursal origen de datos:",sucursales[self.indice2]
        print
        self.procesarDiferencias()

    def existeRegistro(self,tabla,claves,posicion,datos):
        consultaSQL = "SELECT "
        for clave in claves:
            consultaSQL+=clave+","
        consultaSQL = consultaSQL[:-1]+" FROM "+tabla+" WHERE "
        for i,clave in enumerate(claves):
            consultaSQL+=clave+"='"+datos[i]+"' AND"
        consultaSQL = consultaSQL[:-4]
        resultado = consultasBD.ordenCruda(consultaSQL)
        if resultado == ():
            return True
        return False

    def procesarDiferencias(self):
        consultaSQL = "DESCRIBE "+self.comboBox3.GetValue()
        estructuraIncompleta = consultasBD.ordenCruda(consultaSQL)
        insertando = "INSERT INTO "+self.comboBox3.GetValue()+"("
        claves = []
        clavesPOS = []
        for i,campo in enumerate(estructuraIncompleta):
            insertando+= campo[0]+","
            if campo[3] != "":
                claves.append(campo[0])
                clavesPOS.append(i)
        insertando = insertando[:-1]+") VALUES("
        #for i in xrange(len(estructuraIncompleta)):
        #    insertando+="'%s',"
        #insertando = insertando[:-1]+")"

##        self.button1.Enable(True)
##        self.button2.Enable(True)
##        self.button2.SetFocus()
##        return
    
        consultaSQL = "SELECT * FROM "+self.comboBox3.GetValue()+" WHERE 1"
        try:
            print "Leyendo en ",self.comboBox1.GetValue()
            tablaIncompleta,self.conecta = consultasBD.ordenCrudaRemota(consultaSQL,self.indice1)
        except:
            texto = "Sin conexion con "+self.comboBox1.GetValue()+"\no tabla inexistente"
            utiles.mensaje(None,texto)
            self.comboBox1.SetFocus()
            self.button1.Enable(True)
            self.button2.Enable(True)
            return
        print "Registros leidos",len(tablaIncompleta)
        consultaSQL = "SELECT * FROM "+self.comboBox3.GetValue()+" WHERE 1"
        try:
            print "Leyendo en ",self.comboBox2.GetValue()
            tablaExtra,self.conecta = consultasBD.ordenCrudaRemota(consultaSQL,self.indice2)
        except:
            texto = "Sin conexion con "+self.comboBox2.GetValue()+"\no tabla inexistente"
            utiles.mensaje(None,texto)
            self.comboBox1.SetFocus()
            self.button1.Enable(True)
            self.button2.Enable(True)
            return
        print "Registros leidos",len(tablaExtra)

        tablaIncompleta = list(tablaIncompleta)
        tablaExtra = list(tablaExtra)
        
        print "Procesando diferencias"
        #tablaIncompleta = tabla que recibira los registros 
        #existentes en tablaExtra y que no estan en tablaIncompleta
        procesados = 0
        rechazados = 0
        dudosos = 0
        for item in tablaIncompleta:
            
            #pregunta por exactamente iguales
            if item in tablaExtra:
                rechazados+= 1
                continue

##            #se ignoran los similares
##            try:
##                #esta, es similar
            try:
                aux = tablaExtra[tablaExtra.index(item)]
                print aux
                dudosos+= 1
            except:
                print item
##            print "--------------->",aux
##                duplicado = True
##            except:
##                dudosos+= 1
##                duplicado = False
##
##            if duplicado:
##                continue

##            if self.existeRegistro(self.comboBox3.GetValue(),claves,clavesPOS,item):
##                dudosos+= 1
##                continue

            #armando sentencia de insercion
            procesados+= 1
            aux = insertando
            for valor in item:
                aux+="'"+str(valor)+"',"
            aux = aux[:-1]+")"

        print
        print "Tabla a procesar:",self.comboBox1.GetValue()
        print "Tabla desde la que se traen datos:",self.comboBox2.GetValue()
        print "Registros procesados: ",str(procesados)
        print "Registros iguales: ",str(rechazados)
        print "Registros dudosos (estan en ambas tablas pero son diferentes)",str(dudosos)
        print "Fin"
        #terminando, se habilita el boton de Aceptar y el foco esta en Salir
        self.button1.Enable(True)
        self.button2.Enable(True)
        self.button2.SetFocus()
        
                
        
